use std::fmt::Debug;

/// 生命周期限定
/// 生命周期参数可以像 trait 那样作为泛型的限定，有以下两种形式。
/// • T:’a， 表示T类型中的任何引用都要“活得”和’a一样长。
/// • T: Trait + 'a，表示T类型必须实现 Trait，并且T类型中任何引用都要“活得”和’a一样长。
pub fn start() {
    let x = 7;
    let ref_x = Ref(&x);
    print_ref(&ref_x);
    print(ref_x);
}

#[derive(Debug)]
struct Ref<'a, T: 'a>(&'a T);

fn print<T>(t: T)
where
    T: Debug,
{
    println!("{:?}", t);
}

fn print_ref<'a, T>(t: &'a T)
where
    T: Debug + 'a,
{
    println!("{:?}", t);
}
